<template>
    <div>
        <h4>- 属性名表达式</h4>
        <code>使用表达式作为对象的属性名 甚至方法名：obj['a' + 'bc'] = 123;let obj = {[propKey]: true,['a' + 'bc']: 123};</code>
        <p>属性名表达式如果是一个对象，默认情况下会自动将对象转为字符串[object Object]，这一点要特别小心</p>
        <code>！！对象使用getter和setter：const obj = {<b>get</b> foo() {},<b>set</b> foo(x) {}};</code>
        <h4>- 属性的可枚举性</h4>
        <p>Object.getOwnPropertyDescriptor(obj, attr)方法可以获取对象相应属性的描述对象 该描述对象又一个可枚举特性 enumerable 如果该属性为false则有四个操作会忽略该属性：</p>
        <code><b>for...in</b>循环：只遍历对象自身的和继承的可枚举的属性；<b>Object.keys()</b>：返回对象自身的所有可枚举的属性的键名；<b>JSON.stringify()</b>：只串行化对象自身的可枚举的属性；<b>Object.assign()</b>： 忽略enumerable为false的属性，只拷贝对象自身的可枚举的属性</code>
        <p>如数组的length属性，就通过“可枚举性”，从而避免被for...in遍历到；所有 Class 的原型的方法都是不可枚举的!</p>
        <h4>- 属性的遍历</h4>
        <code><b>for...in</b>循环遍历对象自身的和继承的可枚举属性（不含 Symbol 属性）；<b>Object.keys</b>返回一个数组，包括对象自身的（不含继承的）所有可枚举属性（不含 Symbol 属性）的键名；<b>Object.getOwnPropertyNames</b>返回一个数组，包含对象自身的所有属性（不含 Symbol 属性，但是包括不可枚举属性）的键名；<b>Object.getOwnPropertySymbols</b>返回一个数组，包含对象自身的所有 Symbol 属性的键名；<b>Reflect.ownKeys</b>返回一个数组，包含对象自身的所有键名，不管键名是 Symbol 或字符串，也不管是否可枚举。</code>
        <p><b>属性遍历的次序规则：</b>1、首先遍历所有数值键，按照数值升序排列 2、其次遍历所有字符串键，按照加入时间升序排列 3、最后遍历所有 Symbol 键，按照加入时间升序排列</p>
        <h4>- super 关键字</h4>
        <p>this 关键字总是指向函数所在的当前对象；super 关键字指向当前对象的原型对象 <b>只能用在在对象的方法之中</b></p>
        <code><b>注意以下两种情况的区别：</b>cosnt obj = {find() {return super.foo;}} //这里是对象的方法 cosnt obj = {find: function() {return super.foo;}} // 报错！这里super在函数中使用然后复制给了find属性</code>
        <h4>- 使用扩展运算符...：必须是最后一个参数；是浅拷贝 而且不能复制继承自原型对象的属性</h4>
    </div>
</template>

<script>
export default {
    
}
</script>

<style scoped>
h4{
    margin-block-start: 1em;
    margin-block-end: 1em;
}
</style>